package com.itfenghuang.day11;

import java.io.*;

public class A01_对象操作流 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //
        // 1. 案列
        //如果将用户信息保存到本地文件中
        /**
         *  1. 对象操作流
         *
         *          对象操作输出流/对象序列化流   ObjectOutputStream
         *              可以将对象从内存中写到本地文件中,永久花保存
         *              写出去一个字节序列,这个字节序列表示一个对象,
         *                     序列化: 对象的类型,对象的数据,对象的属性信息等写出到了本地文件中
         *
         *          对象操作输入流/对象反序列化流  ObiectInputStream
         *          可以将本地文件中的对象读取到内存中
         *
         *   2. 为什么在序列化一个对象的时候,该对象所在类需要实现一个 Serializable 接口
         *          标记性接口,里面没有任何的抽象方法,只要一个类实现了该接口
         *          表示该类的对象可以被序列化
         *
         *   3.用对象序列化流序列化一个对象后,假如修改了对象所属的类,在进行反序列化操作
         *      的时候会出现问题,异常 InvalidClassException
         *      如何解决:
         *
         *          加一个序列号
         *          private static final long serialVersionUID=1L;
         *
         *    4.如果某个属性不想序列化
         *      transient  瞬时的 顺态
         *      在该属性前加关键字 transient 这个属性就不能狗被序列化
         *
         *    5.练习题
         *     序列化对个学生对象出去到本地文件中然后再反序列化到内存中然后打印这些学生对象
         *          首先将学生对象存储到集合中,将集合序列化到本地文件中
         *          最后反序列化一次
         */

        //使用序列化流写出一个对象
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\it\\a.txt"));
        User user = new User("张三", "18");
        oos.writeObject(user);
        oos.close();

        //使用反序列化读入对象
        ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\it\\a.txt"));
        System.out.println(ois.readObject());
        ois.close();

    }
}
class User implements Serializable {
    private  String name;
    private transient String age;
    private String sex;
    private static final long serialVersionUID=1L;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age='" + age + '\'' +
                '}';
    }
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public User() {
    }

    public User(String name, String age) {
        this.name = name;
        this.age = age;
    }
}
